// ----------------------------------
// RSDK Project: Sonic Essence
// Script Description: Options Menu
// Script Author: Tails_LP, Xanman
// ----------------------------------

//-------Aliases-------//

private alias object.value0 : menu.xpos
private alias object.value1 : menu.selection
private alias object.value2 : start.fadeValue
private alias object.value3 : menu.direction
private alias object.value4 : creditsoffset
private alias object.value5 : timer
private alias object.value6 : arrowoffset

private alias 0 : INACTIVE
private alias 1 : SCROLL_IN

private alias 2 : OPTIONS_IDLE

private alias 8 : SCROLL_OUT
private alias 9 : EXITING

//-------Function declarations-------//
public alias saveRAM[261] : buttons	

//-------Static Values-------//
private value fullscreen = 0;
private value scale = 0;
private value vsync = 0;
private value filter = 0;

//-------Tables-------//


//-------Functions-------//

event ObjectMain
	object.inkEffect = INK_ALPHA
	switch object.state
	case INACTIVE
		menu.xpos = 8
		break
	case SCROLL_IN
		object.alpha = 255
		if menu.xpos > -160
			menu.xpos -= 12
		else
			menu.xpos = -160
			object.state = OPTIONS_IDLE
			temp4 = 0
		endif
		break
	case OPTIONS_IDLE
		object.alpha = 255
		

		if inputPress.down == 1
			if menu.selection < 6
				menu.selection ++
			else
				menu.selection = 0
			endif
			PlaySfx(SfxName[Menu Move], 0)
		endif
		if inputPress.up == 1	
			if menu.selection > 0
				menu.selection --
			else
				menu.selection = 6
			endif
			PlaySfx(SfxName[Menu Move], 0)
		endif

		temp0 = inputPress.left
		temp0 |= inputPress.right
		if temp0 == 1
			PlaySfx(SfxName[Menu Move], 0)
		end if

		switch menu.selection
		case 0
			if inputPress.left == 1
				Engine.BGMVolume -= 10
				if Engine.BGMVolume < 0
					Engine.BGMVolume = 0
				end if
			end if
			if inputPress.right == 1
				Engine.BGMVolume += 10
				if Engine.BGMVolume > 100
					Engine.BGMVolume = 100
				end if
			end if
			break
		case 1
			if inputPress.left == 1
				Engine.SFXVolume -= 10
				if Engine.SFXVolume < 0
					Engine.SFXVolume = 0
				end if
			end if
			if inputPress.right == 1
				Engine.SFXVolume += 10
				if Engine.SFXVolume > 100
					Engine.SFXVolume = 100
				end if
			end if
			break
		case 2
			temp0 = inputPress.left
			temp0 |= inputPress.right
			if temp0 == 1
				fullscreen ^= 1
				CallNativeFunction2(SetWindowFullScreen, fullscreen, 0)
			end if
			break
		case 3
			if inputPress.left == 1					
				scale--
				if scale < 1
					scale = 4
				end if
				CallNativeFunction2(SetWindowScale, scale, 0)
			end if
			if inputPress.right == 1
				scale++
				if scale > 4
					scale = 1
				end if
				CallNativeFunction2(SetWindowScale, scale, 0)
			end if
			break
		case 4
			if inputPress.left == 1					
				filter--
				if filter < 0
					filter = 3
				end if
				CallNativeFunction2(SetWindowScaleMode, filter, 0)
			end if
			if inputPress.right == 1
				filter++
				if filter > 3
					filter = 0
				end if
				CallNativeFunction2(SetWindowScaleMode, filter, 0)
			end if
			break
		case 5
			if inputPress.left == 1					
				buttons--
				if buttons < 0
					buttons = 3
				end if
			end if
			if inputPress.right == 1
				buttons++
				if buttons > 3
					buttons = 0
				end if
			end if
			WriteSaveRAM()
			break
		case 6
			if inputPress.buttonA == 1				
				object.state = EXITING
				CreateTempObject(TypeName[Config Screen], 0, 0, 0)
				object[tempObjectPos].state = 0
				object[tempObjectPos].value4 = menu.selection
			end if
			if inputPress.Start == 1				
				object.state = EXITING
				CreateTempObject(TypeName[Config Screen], 0, 0, 0)
				object[tempObjectPos].state = 0
				object[tempObjectPos].value4 = menu.selection
			end if
			WriteSaveRAM()
			break
		end switch
			if inputPress.buttonB == 1	
				PlaySfx(SfxName[Menu Back], 0)
				object.state = SCROLL_OUT
			end if
		break
	case SCROLL_OUT
		if menu.xpos < 8
			menu.xpos += 12
		else
			creditsoffset = 0
			menu.xpos = 8
			object.state = INACTIVE
			foreach (TypeName[Main Menu], arrayPos0, ALL_ENTITIES)
				object[arrayPos0].state = 1
			next
		endif
		break
	case EXITING
		break
	endswitch
end event

event ObjectDraw
	arrowoffset++
	temp0 = screen.xsize
	temp0 += menu.xpos
	DrawRect(temp0, 0, 160, screen.ysize, 0, 0, 0, 255)

	temp0 -= 4
	temp1-= arrowoffset
	while temp1 < screen.ysize
		DrawSpriteScreenXY(0, temp0, temp1)
		temp1 += 64
		DrawSpriteScreenXY(0, temp0, temp1)
		temp1 += 64
	loop

		temp0 = screen.xsize
		temp0 += menu.xpos
		temp0 += 58
		temp1 = 20
		DrawSpriteScreenFX(4, FX_INK, temp0, temp1)
		temp1 += 10
		DrawSpriteScreenFX(7, FX_INK, temp0, temp1)
		temp0 -= 26
		temp1 += 12
		DrawSpriteScreenFX(8, FX_INK, temp0, temp1)
		temp1 += 12
		temp4 = Engine.BGMVolume	
		temp4 /= 10
		temp4 += 10
		temp0 += 90
		DrawSpriteScreenFX(temp4, FX_INK, temp0, temp1)
		temp0 -= 90

		temp1 += 14
		DrawSpriteScreenFX(9, FX_INK, temp0, temp1)
		temp1 += 12
		temp4 = Engine.SFXVolume	
		temp4 /= 10
		temp4 += 10
		temp0 += 90
		DrawSpriteScreenFX(temp4, FX_INK, temp0, temp1)
		temp0 -= 90

		temp1 += 14
		DrawSpriteScreenFX(21, FX_INK, temp0, temp1)
		temp1 += 12
		temp0 += 90
		switch fullscreen
		case 0
			DrawSpriteScreenFX(22, FX_INK, temp0, temp1)
			break
		case 1
			DrawSpriteScreenFX(23, FX_INK, temp0, temp1)
			break
		end switch
		temp0 -= 90

		temp1 += 14
		DrawSpriteScreenFX(24, FX_INK, temp0, temp1)
		temp1 += 12
		temp0 += 90
		switch scale
		case 1
			DrawSpriteScreenFX(11, FX_INK, temp0, temp1)
			break
		case 2
			DrawSpriteScreenFX(12, FX_INK, temp0, temp1)
			break
		case 3
			DrawSpriteScreenFX(13, FX_INK, temp0, temp1)
			break
		case 4
			DrawSpriteScreenFX(14, FX_INK, temp0, temp1)
			break
		end switch
		temp0 -= 90

		temp1 += 14
		DrawSpriteScreenFX(25, FX_INK, temp0, temp1)
		temp1 += 12
		temp0 += 54
		switch filter
		case 0
			DrawSpriteScreenFX(29, FX_INK, temp0, temp1)
			break
		case 1
			DrawSpriteScreenFX(26, FX_INK, temp0, temp1)
			break
		case 2
			DrawSpriteScreenFX(27, FX_INK, temp0, temp1)
			break
		case 3
			DrawSpriteScreenFX(28, FX_INK, temp0, temp1)
			break
		end switch
		temp0 -= 54

		temp1 += 14
		DrawSpriteScreenFX(30, FX_INK, temp0, temp1)
		temp1 += 12
		temp0 += 54
		switch buttons
		case 0
			DrawSpriteScreenFX(31, FX_INK, temp0, temp1)
			break
		case 1
			DrawSpriteScreenFX(32, FX_INK, temp0, temp1)
			break
		case 2
			DrawSpriteScreenFX(33, FX_INK, temp0, temp1)
			break
		case 3
			DrawSpriteScreenFX(34, FX_INK, temp0, temp1)
			break
		end switch
		temp0 -= 54
		temp1 += 14

		DrawSpriteScreenFX(35, FX_INK, temp0, temp1)

		temp1 = menu.selection
		temp1 *= 26
		temp1 += 42
		DrawSpriteScreenFX(6, FX_INK, temp0, temp1)

end event

event ObjectStartup
	CallNativeFunction(GetWindowScale)
	scale = checkResult
	CallNativeFunction(GetWindowFullScreen)
	fullscreen = checkResult
	CallNativeFunction(GetWindowVSync)
	vsync = checkResult
	CallNativeFunction(GetWindowScaleMode)
	filter = checkResult

	object[12].type = TypeName[Options Menu]
    	LoadSpriteSheet("Title/Title2.gif")
		SpriteFrame(-4, 0, 8, 128, 219, 1)		//00 Black Banner
		SpriteFrame(0, -3, 94, 7, 1, 156)		//01 Adventure Mode
		SpriteFrame(0, -3, 68, 7, 1, 370)		//02 Ranking
		SpriteFrame(0, -3, 43, 7, 1, 378)		//03 Credits
		SpriteFrame(0, -3, 42, 8, 1, 181)		//04 Options
		SpriteFrame(0, -3, 22, 7, 1, 190)		//05 Quit
		SpriteFrame(-10, -3, 4, 7, 91, 164)	//06 Arrow
		SpriteFrame(-25, 0, 94, 1, 1, 199)		//07 Line


	SpriteFrame(0, -3, 90, 7, 1, 201)		//08 Music Volume
	SpriteFrame(0, -3, 92, 7, 1, 209)		//09 SoundFX Volume

	SpriteFrame(0, -3, 7, 7, 1, 241)		//10 0
	SpriteFrame(0, -3, 7, 7, 1, 249)		//11 1
	SpriteFrame(0, -3, 7, 7, 1, 257)		//12 2
	SpriteFrame(0, -3, 7, 7, 1, 265)		//13 3
	SpriteFrame(0, -3, 7, 7, 1, 273)		//14 4
	SpriteFrame(0, -3, 7, 7, 1, 281)		//15 5
	SpriteFrame(0, -3, 7, 7, 1, 289)		//16 6
	SpriteFrame(0, -3, 7, 7, 1, 297)		//17 7
	SpriteFrame(0, -3, 7, 7, 1, 305)		//18 8
	SpriteFrame(0, -3, 7, 7, 1, 313)		//19 9
	SpriteFrame(-17, -3, 25, 7, 9, 241)		//20 MAX

	SpriteFrame(0, -3, 90, 7, 1, 217)		//21 FullScreen

	SpriteFrame(-15, -3, 20, 7, 1, 353)	//22 Off
	SpriteFrame(-9, -3, 15, 7, 1, 361)		//23 On

	SpriteFrame(0, -3, 90, 7, 1, 225)		//24 Window Size

	SpriteFrame(0, -3, 90, 7, 1, 233)		//25 Screen Filter
	SpriteFrame(0, -3, 90, 8, 1, 321)		//26 Integer
	SpriteFrame(-41, -3, 90, 8, 1, 329)	//27 Sharp
	SpriteFrame(0, -3, 90, 8, 1, 337)		//28 Bilinear
	SpriteFrame(0, -3, 90, 8, 1, 345)		//29 Default
	
	SpriteFrame(0, -3, 80, 8, 294, 241)	//30 Button Design
	SpriteFrame(-13, -3, 80, 8, 294, 249)	//31 Keyboard
	SpriteFrame(15, -3, 80, 8, 294, 257)	//32 Xbox
	SpriteFrame(-24, -3, 80, 8, 294, 265)	//33 Playstation
	SpriteFrame(-8, -3, 80, 7, 294, 273)	//34 Switch

	SpriteFrame(0, -3, 125, 8, 294, 409)		//35 CLEAR
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 223, 172)
end event